﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Logica.Clases;
using Sistema_Totem.Logica.Excepciones;
using System.Data.SqlClient;

namespace Sistema_Totem.Datos.SqlServer
{
    public class SqlServerMinuta
    {
        #region Lista de Minutas
        /// <summary>
        /// Método que accede a la base de datos
        /// y devuelve una lista de minutas.
        /// </summary>
        /// <returns></returns>
        public List<Minutas> ListaDeMinutas()
        {
            List<Minutas> listaMinuta = new List<Minutas>();

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            miConexion.AbrirConexionBd();
            command.Connection = miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "[dbo].[SELMinuta]"; //Nombre del StoreProcedure "SELMinuta"
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                Minutas minuta = new Minutas();
                minuta.Id = Convert.ToInt32(reader["IdMinuta"]);
                minuta.Codigo = reader["Codigo"].ToString();
                minuta.Titulo = reader["Titulo"].ToString();
                minuta.Descripcion = reader["Descripcion"].ToString();
                minuta.Fecha = Convert.ToDateTime(reader["FechaMinuta"]);

                listaMinuta.Add(minuta);
            }
            reader.Close();
            miConexion.CerrarConexionBd();
            if (listaMinuta.ElementAt(0).Fecha == null)
            {
                return null;
            }
            else
                return listaMinuta;
        }
        #endregion Lista de Minutas

        #region Lista de Secciones de plantilla
        /// <summary>
        /// metodo que consulta todas las secciones de una plantilla de minuta
        /// </summary>
        /// <param name="idProyecto">Se busca por el id del proyecto</param>
        /// <returns>la lista de secciones que tiene asociada esa plantilla en el proyecto</returns>
        public List<Seccion> miListaSeccionesMinutas(int idProyecto)
        {
            //se instancia una conexion a la BD
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            List<Seccion> miListaSecciones = new List<Seccion>();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[consultarSeccionMinuta]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idProyecto", idProyecto);
                SqlDataReader readers = command.ExecuteReader();
                while (readers.Read())
                {
                    Seccion miSeccion = new Seccion();
                    //Se asigna el atributo nombre al objeto seccion
                    miSeccion.Nombre = readers.GetString(1);
                    //se inserta el cliente en la lista de clientes
                    miListaSecciones.Add(miSeccion);
                }
                
            }
            catch (SqlException errorBD)
            {
                //uso interno del grupo 7, para capturar cualquier excepcion y posterior estudio para solventar el problema
                throw new MinutaExcepcion(("Error: Operación fallida " + errorBD.Message), errorBD);
            }

            catch (Exception errorGeneral)
            {
                //uso interno del grupo 7, para capturar cualquier excepcion y posterior estudio para solventar el problema
                throw new MinutaExcepcion(("Error: Operación fallida " + errorGeneral.Message), errorGeneral);
            }
            finally
            {
                //se cierra la conexion a la BD
                bd.CerrarConexionBd();
            }

            return miListaSecciones;

        }
        #endregion lista de Secciones de plantilla

        internal List<Seccion> CargarElementos(List<Seccion> misSecciones, int IdProyecto)
        {
            foreach (Seccion miSeccion in misSecciones)
            {
                //se instancia una conexion a la BD
                Conexion bd = new Conexion();
                SqlCommand command = new SqlCommand();
                try
                {
                    bd.AbrirConexionBd();
                    command.Connection = bd.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "[dbo].[consultarSeccionElementosMinuta]";
                    command.CommandTimeout = 10;
                    command.Parameters.AddWithValue("@idProyecto", IdProyecto);
                    SqlDataReader readers = command.ExecuteReader();
                    while (readers.Read())
                    {
                        Elemento miElemento = new Elemento();
                        //Se asigna el atributo nombre al objeto elemento
                        miElemento.Nombre = readers[4].ToString();
                        miElemento.NombreTipoElemento = readers[10].ToString();
                        //se inserta el cliente en la lista de clientes
                        if (miSeccion.Nombre.Equals(readers[9].ToString()))
                            miSeccion.MiListaElementos.Add(miElemento);
                    }

                }
                catch (SqlException errorBD)
                {
                    //uso interno del grupo 7, para capturar cualquier excepcion y posterior estudio para solventar el problema
                    throw new MinutaExcepcion(("Error: Operación fallida " + errorBD.Message), errorBD);
                }

                catch (Exception errorGeneral)
                {
                    //uso interno del grupo 7, para capturar cualquier excepcion y posterior estudio para solventar el problema
                    throw new MinutaExcepcion(("Error: Operación fallida " + errorGeneral.Message), errorGeneral);
                }
                finally
                {
                    //se cierra la conexion a la BD
                    bd.CerrarConexionBd();
                }
                
            }
            return misSecciones;
        }
    }
}